home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 November: Tool Chest / Dev.CD Nov 00 TC Disk 1.toast / Sample Code / Interapplication Comm / 7Edit / Source / SVAEGetDataSize.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-28  |  4.5 KB  |  172 lines  |  [TEXT/CWIE]

  1. /*
  2.     File:        SVAEGetDataSize.c
  3.  
  4.     Contains:    
  5.  
  6.     Written by: Original version by Jon Lansdell and Nigel Humphreys.
  7.                 3.1 updates by Greg Sutton.
  8.  
  9.     Copyright:    Copyright © 1995-1999 by Apple Computer, Inc., All Rights Reserved.
  10.  
  11.                 You may incorporate this Apple sample source code into your program(s) without
  12.                 restriction. This Apple sample source code has been provided "AS IS" and the
  13.                 responsibility for its operation is yours. You are not permitted to redistribute
  14.                 this Apple sample source code as "Apple sample source code" after having made
  15.                 changes. If you're going to re-distribute the source, we require that you make
  16.                 it clear in the source that the code was descended from Apple sample source
  17.                 code, but that you've made changes.
  18.  
  19.     Change History (most recent first):
  20.                 7/20/1999    Karl Groethe    Updated for Metrowerks Codewarror Pro 2.1
  21.                 
  22.  
  23. */
  24.  
  25. #include "SVAEGetDataSize.h"
  26.  
  27. #include "SVEditAEUtils.h"
  28.  
  29. // -----------------------------------------------------------------------
  30. //        Name:             DoGetDataSize
  31. //        Purpose:        Handles the GetDataSize AppleEvent.
  32. // -----------------------------------------------------------------------
  33.  
  34. pascal OSErr    DoGetDataSize(const AppleEvent    *theAppleEvent,
  35.                                     AppleEvent    *reply,
  36.                                     long        handlerRefCon)
  37. #pragma unused (handlerRefCon)
  38.  
  39.     AEDesc        directObj = {typeNull, NULL},
  40.                 result = {typeNull, NULL};
  41.     Size          actualSize;
  42.     DescType      returnedType;
  43.     DescType      reqType;
  44.     OSErr         err;
  45.     
  46.         // pick up the direct object, which is the object whose data is to be sized
  47.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);
  48.         
  49.         // now the get the type wanted - optional
  50.     reqType = typeChar;    // Default to char
  51.     (void)AEGetParamPtr(theAppleEvent, keyAERequestedType, typeType, &returnedType,
  52.                                                 (Ptr)&reqType, sizeof(reqType), &actualSize);
  53.         
  54.     err = GotRequiredParams(theAppleEvent);
  55.     if (noErr != err) goto done;
  56.     
  57.     if (typeNull != directObj.descriptorType)
  58.         err = GetDataSizeDesc(&directObj, reqType, &result);
  59.     else
  60.         err = errAENoSuchObject;
  61.         
  62.     err = AddResultToReply(&result, reply, err);
  63.  
  64. done:    
  65.     if (directObj.dataHandle) 
  66.         AEDisposeDesc(&directObj);
  67.     if (result.dataHandle) 
  68.         AEDisposeDesc(&result);
  69.             
  70.     return(err);
  71. } // DoGetDataSize
  72.  
  73.  
  74. OSErr    GetDataSizeTextToken(TextToken* theToken, AEDesc* result)
  75. {
  76.     long    aSize;
  77.     OSErr    err;
  78.     
  79.     aSize = theToken->tokenLength;
  80.     
  81.     err = AECreateDesc(typeLongInteger, (Ptr)&aSize, sizeof(aSize), result);
  82.  
  83.     return(err);
  84. }
  85.  
  86. OSErr    GetDataSizeTextDesc(AEDesc* textDesc, AEDesc* result)
  87. {
  88.     TextToken        aTextToken;
  89.     Size            actualSize;
  90.     OSErr            err;
  91.  
  92.     if (typeMyText != textDesc->descriptorType)
  93.         return(errAETypeError);
  94.         
  95.     GetRawDataFromDescriptor(textDesc, (Ptr)&aTextToken, sizeof(aTextToken), &actualSize);
  96.  
  97.     err = GetDataSizeTextToken(&aTextToken, result);
  98.     
  99.     return(err);
  100. }
  101.  
  102. OSErr    GetDataSizeDesc(AEDesc* aDesc, DescType reqType, AEDesc* result)
  103. {
  104.     AEDesc        dataSizeDesc = {typeNull, NULL},
  105.                 textDesc = {typeNull, NULL},
  106.                 itemDesc = {typeNull, NULL},
  107.                 itemResult = {typeNull, NULL};
  108.     long        itemCount,
  109.                 index;
  110.     DescType    theAEKeyword;
  111.     OSErr        err;
  112.     
  113.     if (typeObjectSpecifier == aDesc->descriptorType)
  114.         err = AEResolve(aDesc, kAEIDoMinimum, &dataSizeDesc);
  115.     else
  116.         err = AEDuplicateDesc(aDesc, &dataSizeDesc);
  117.         
  118.     if (noErr != err) goto done;
  119.     
  120.     if (typeAEList == dataSizeDesc.descriptorType)
  121.     {
  122.         err = AECreateList(NULL, 0 , false, result);    // Result will also be a list of items
  123.         if (noErr != err) goto done;
  124.         err = AECountItems(&dataSizeDesc, &itemCount);
  125.         if (noErr != err) goto done;
  126.         
  127.         for (index = 1; index <= itemCount; index++)
  128.         {
  129.             err = AEGetNthDesc(&dataSizeDesc, index, typeWildCard, &theAEKeyword, &itemDesc);
  130.             if (noErr != err) goto done;
  131.             
  132.             err = GetDataSizeDesc(&itemDesc, reqType, &itemResult);    // Call recursively
  133.             if (noErr != err) goto done;
  134.             
  135.             err = AEPutDesc(result, 0, &itemResult);    // Add to our result list
  136.             if (noErr != err) goto done;
  137.  
  138.             if (itemDesc.dataHandle)
  139.                 AEDisposeDesc(&itemDesc);
  140.             if (itemResult.dataHandle)
  141.                 AEDisposeDesc(&itemResult);
  142.         }
  143.     }
  144.     else
  145.     {
  146.         switch (reqType)
  147.         {
  148.             case typeChar:
  149.                 err = AECoerceDesc(&dataSizeDesc, typeMyText, &textDesc);
  150.                 if (noErr != err) goto done;
  151.                 err = GetDataSizeTextDesc(&textDesc, result);
  152.                 break;
  153.                 
  154.             default:
  155.                 err = errAECantSupplyType;
  156.         }
  157.     }
  158.     
  159. done:
  160.     if (dataSizeDesc.dataHandle)
  161.         AEDisposeDesc(&dataSizeDesc);
  162.     if (textDesc.dataHandle)
  163.         AEDisposeDesc(&textDesc);
  164.     if (itemDesc.dataHandle)
  165.         AEDisposeDesc(&itemDesc);
  166.     if (itemResult.dataHandle)
  167.         AEDisposeDesc(&itemResult);
  168.     
  169.     return(err);
  170. }
  171.